package keyword;

/**
 * Volatile关键字
 * happens-before：保证跨线程的内存可见性
 * 应用场景：
 *
 * @author <a href="mailto:sjj@jianzhimao.com">mojo</a>
 * copyright (C), 2013-2022, 广州九尾信息科技有限公司
 * @date 2022/2/11 10:22
 */
public class VolatileDemo {
    volatile int n = 0;

    public int increase() {
        return n++;
    }

    public static void main(String[] args) {
        //volatile轻量同步机制
        //前置条件：JMM内存模型
        //特性1、保证线程之间变量的可见性，不保证原子性；可见性的保障是基于CPU的内存屏障指令。工作内存中修改共享变量的值同步到主内存
        //特性2、禁止指令重排；（指令重排是指在不改变单线程执行结果的前提下对现有指令顺序进行重排，优化程序执行效率）

        //原理：JVM底层采用”内存屏障“实现

        //不适合复合操作，示例
        VolatileDemo demo = new VolatileDemo();
        for (int i = 1; i <= 3; i++) {
            new Thread(() -> {
                for (int i1 = 0; i1 < 1000; i1++) {
                    demo.increase();
                }
            }).start();
        }
        while (Thread.activeCount() > 1) {
            Thread.yield();
        }
        System.out.println(demo.n);

    }
}
